using RAG.Domain.DomainEvents;
using RAG.Domain.Interfaces;
using RAG.Application.Interfaces;
using RAG.Domain.Entities.App;
using RAG.Infrastructure.Data;
using Microsoft.EntityFrameworkCore;

namespace RAG.Application.Services;

/// <summary>
/// 用户创建事件处理器
/// </summary>
public class UserCreatedEventHandler : IDomainEventHandler<UserCreatedEvent>
{
    private readonly IAppLogService _logService;
    private readonly RagDbContext _dbContext;

    public UserCreatedEventHandler(IAppLogService logService, RagDbContext dbContext)
    {
        _logService = logService;
        _dbContext = dbContext;
    }

    public async Task HandleAsync(UserCreatedEvent @event)
    {
        try
        {
            Console.WriteLine($"处理用户创建事件: 用户ID={@event.User.Id}, 用户名={@event.User.Username}, 创建者={@event.CreatedBy}, 客户端类型={@event.ClientType}");

            // 记录用户创建日志
            _logService.LogBusinessOperation(
                "USER_CREATED",
                @event.User.Id.ToString(),
                $"用户 {@event.User.Username} 被 {@event.CreatedBy} 创建，客户端类型: {@event.ClientType}"
            );

            // 为用户分配默认角色
            await AssignDefaultRoleToUserAsync(@event.User);

            // 发送欢迎邮件（如果需要）
            // await SendWelcomeEmailAsync(@event.User);

            // 记录系统日志
            Console.WriteLine($"用户 {@event.User.Username} 创建成功，事件处理完成");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"处理用户创建事件时发生错误: {ex.Message}");
            _logService.LogError($"处理用户创建事件时发生错误: {ex.Message}", ex);
            // 不重新抛出异常，避免影响主流程
        }
    }

    /// <summary>
    /// 为用户分配默认角色
    /// </summary>
    private async Task AssignDefaultRoleToUserAsync(Users user)
    {
        try
        {
            // 获取或创建默认角色
            var defaultRole = await GetOrCreateDefaultUserRoleAsync();
            
            // 检查用户是否已经有这个角色
            var existingRole = await _dbContext.Roles
                .Where(r => !r.IsDeleted && r.Id == defaultRole.Id)
                .Include(r => r.Users)
                .FirstOrDefaultAsync();

            if (existingRole != null && !existingRole.Users.Any(u => u.Id == user.Id))
            {
                existingRole.Users.Add(user);
                await _dbContext.SaveChangesAsync();
                Console.WriteLine($"已为用户 {user.Username} 分配默认角色: {existingRole.RoleName}");
                
                // 记录角色分配日志
                _logService.LogBusinessOperation(
                    "ROLE_ASSIGNED",
                    user.Id.ToString(),
                    $"为用户 {user.Username} 分配默认角色: {existingRole.RoleName}"
                );
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"为用户分配默认角色时发生错误: {ex.Message}");
            _logService.LogError($"为用户分配默认角色时发生错误: {ex.Message}", ex);
            // 不抛出异常，避免影响事件处理流程
        }
    }

    /// <summary>
    /// 获取或创建默认的普通用户角色
    /// </summary>
    private async Task<Role> GetOrCreateDefaultUserRoleAsync()
    {
        try
        {
            // 查找名为"普通用户"的角色
            var defaultRole = await _dbContext.Roles
                .Where(r => !r.IsDeleted && r.RoleName == "普通用户")
                .FirstOrDefaultAsync();

            if (defaultRole != null)
            {
                Console.WriteLine($"找到现有的普通用户角色: {defaultRole.Id}");
                return defaultRole;
            }

            // 如果不存在，创建默认的普通用户角色
            Console.WriteLine("未找到普通用户角色，正在创建...");
            defaultRole = new Role
            {
                Id = Guid.NewGuid(),
                RoleName = "普通用户",
                RoleDescription = "系统默认的普通用户角色，新创建用户自动分配此角色",
                IsActive = true,
                IsDeleted = false,
                CreatedAt = DateTime.UtcNow,
                UpdatedAt = DateTime.UtcNow
            };

            _dbContext.Roles.Add(defaultRole);
            await _dbContext.SaveChangesAsync();

            Console.WriteLine($"已创建默认的普通用户角色: {defaultRole.Id} - {defaultRole.RoleName}");
            
            // 记录角色创建日志
            _logService.LogBusinessOperation(
                "ROLE_CREATED",
                "system",
                $"创建默认角色: {defaultRole.RoleName} (ID: {defaultRole.Id})"
            );
            
            return defaultRole;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"创建默认角色时发生错误: {ex.Message}");
            _logService.LogError($"创建默认角色时发生错误: {ex.Message}", ex);
            throw; // 重新抛出异常，因为这是关键功能
        }
    }
}
